home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / MiscKit1.7.1 / MiscKit / Palettes / MiscCalendarPalette / MiscCalendarView.subproj / MiscCalendarMatrix.m < prev    next >
Text File  |  1995-04-12  |  11KB  |  525 lines

  1. // Copyright (C) 1995 Jon Kutemeier
  2. // Use is governed by the MiscKit license
  3.  
  4. #import <appkit/Application.h>
  5. #import <appkit/Font.h>
  6.  
  7. #import "misckit/MiscCalendarViewConstants.h"
  8. #import "misckit/DateDelegateProtocol.h"
  9. #import "MiscCalendarMatrix.h"
  10. #import "DateSelectionCell.h"
  11. #import "SimpleDate.h"
  12.  
  13. @implementation MiscCalendarMatrix
  14.  
  15. + initialize
  16. {
  17.     [MiscCalendarMatrix setVersion:1];
  18.  
  19.     return self;
  20. }
  21.  
  22. - initFrame:(const NXRect *)frameRect
  23. {
  24.     NXSize     spacing,
  25.         newCellSize;
  26.     id        aCell;
  27.  
  28.     [super initFrame:frameRect mode:NX_RADIOMODE
  29.      prototype:[[DateSelectionCell alloc] init] numRows:NUM_MATRIX_ROWS
  30.      numCols:NUM_MATRIX_COLS];
  31.     [self setEmptySelectionEnabled:YES];
  32.  
  33.     [self clearSelectedCell];
  34.  
  35.     [Font setUserFont:[Font newFont:"Helvetica" size:11 style:0
  36.                matrix:NX_FLIPPEDMATRIX]];
  37.  
  38.     [self setFont:[Font newFont:"Helvetica" size:11 style:0
  39.            matrix:NX_FLIPPEDMATRIX]];
  40.  
  41.     spacing.height = MATRIX_SPACING_HEIGHT;
  42.     spacing.width = MATRIX_SPACING_WIDTH;
  43.  
  44.     [self setIntercell:&spacing];
  45.  
  46.     newCellSize.height = MATRIX_CELL_HEIGHT;
  47.     newCellSize.width = MATRIX_CELL_WIDTH;
  48.  
  49.     [self setCellSize:&newCellSize];
  50.  
  51.     [self sizeToCells];
  52.  
  53.     [self sizeBy:1 :1];
  54.  
  55.     simpleDate = [[SimpleDate alloc] init];
  56.  
  57.     [self setDateDelegate:simpleDate];
  58.  
  59.     aCell = [[self cellList] objectAt:0];
  60.  
  61.     cellTextColor = [aCell textColor];
  62.     cellHighlightTextColor = [aCell highlightTextColor];
  63.     cellHighlightColor = [aCell highlightColor];
  64.     cellBackgroundColor = [aCell backgroundColor];
  65.  
  66.     overwriteCellColors = NO;
  67.  
  68.     [self displayDate:self];
  69.  
  70.     return self;
  71. }
  72.  
  73. - initFrame:(const NXRect *)frameRect mode:(int)aMode cellClass:cellId
  74.   numRows:(int)numRows numCols:(int)numCols
  75. {
  76.     return [self initFrame:frameRect];
  77. }
  78.  
  79. - initFrame:(const NXRect *)frameRect mode:(int)aMode prototype:aCell
  80.   numRows:(int)numRows numCols:(int)numCols
  81. {
  82.     return [self initFrame:frameRect];
  83. }
  84.  
  85. - free
  86. {
  87.     [simpleDate free];
  88.  
  89.     return [super free];
  90. }
  91.  
  92. - setDateDelegate:aDateObject
  93. {
  94.     if ([aDateObject conformsTo:@protocol(DateDelegate)])
  95.       dateDelegate = aDateObject;
  96.  
  97.     return self;
  98. }
  99.  
  100. - dateDelegate
  101. {
  102.     return dateDelegate;
  103. }
  104.  
  105. - overwriteCellColors:(BOOL)yn
  106. {
  107.     overwriteCellColors = yn;
  108.  
  109.     return self;
  110. }
  111.  
  112. - (BOOL)cellColorsOverwritten
  113. {
  114.     return overwriteCellColors;
  115. }
  116.  
  117. - setCellBackgroundColor:(NXColor)aColor
  118. {
  119.     List    *myCellList;
  120.     id        aCell;
  121.     int        i;
  122.  
  123.     myCellList = [self cellList];
  124.  
  125.     for (i = 0; i < [myCellList count]; i++)
  126.     {
  127.     aCell = [myCellList objectAt:i];
  128.  
  129.     if (overwriteCellColors || 
  130.         NXEqualColor(cellBackgroundColor, [aCell backgroundColor]))
  131.       [aCell setBackgroundColor:aColor];
  132.     }
  133.  
  134.     cellBackgroundColor = aColor;
  135.  
  136.     return self;
  137. }
  138.  
  139. - (NXColor)cellBackgroundColor
  140. {
  141.     return cellBackgroundColor;
  142. }
  143.  
  144. - setBackgroundColor:(NXColor)aColor forCellAt:(int)xPos :(int)yPos
  145. {
  146.     [[self cellAt:xPos :yPos] setBackgroundColor:aColor];
  147.  
  148.     return self;
  149. }
  150.  
  151. - (NXColor)backgroundColorForCellAt:(int)xPos :(int)yPos
  152. {
  153.     return [[self cellAt:xPos :yPos] backgroundColor];
  154. }
  155.  
  156. - setCellHighlightColor:(NXColor)aColor
  157. {
  158.     List    *myCellList;
  159.     id        aCell;
  160.     int        i;
  161.  
  162.     myCellList = [self cellList];
  163.  
  164.     for (i = 0; i < [myCellList count]; i++)
  165.     {
  166.     aCell = [myCellList objectAt:i];
  167.  
  168.     if (overwriteCellColors || 
  169.         NXEqualColor(cellHighlightColor, [aCell highlightColor]))
  170.       [aCell setHighlightColor:aColor];
  171.     }
  172.  
  173.     cellHighlightColor = aColor;
  174.  
  175.     return self;
  176. }
  177.  
  178. - (NXColor)cellHighlightColor
  179. {
  180.     return cellHighlightColor;
  181. }
  182.  
  183. - setHighlightColor:(NXColor)aColor forCellAt:(int)xPos :(int)yPos
  184. {
  185.     [[self cellAt:xPos :yPos] setHighlightColor:aColor];
  186.  
  187.     return self;
  188. }
  189.  
  190. - (NXColor)highlightColorForCellAt:(int)xPos :(int)yPos
  191. {
  192.     return [[self cellAt:xPos :yPos] highlightColor];
  193. }
  194.  
  195. - setCellTextColor:(NXColor)aColor
  196. {
  197.     List    *myCellList;
  198.     id        aCell;
  199.     int        i;
  200.  
  201.     myCellList = [self cellList];
  202.  
  203.     for (i = 0; i < [myCellList count]; i++)
  204.     {
  205.     aCell = [myCellList objectAt:i];
  206.     if (overwriteCellColors || 
  207.         NXEqualColor(cellTextColor, [aCell textColor]))
  208.     [aCell setTextColor:aColor];
  209.     }
  210.  
  211.     cellTextColor = aColor;
  212.  
  213.     return self;
  214. }
  215.  
  216. - (NXColor)cellTextColor
  217. {
  218.     return cellTextColor;
  219. }
  220.  
  221. - setTextColor:(NXColor)aColor forCellAt:(int)xPos :(int)yPos
  222. {
  223.     [[self cellAt:xPos :yPos] setTextColor:aColor];
  224.  
  225.     return self;
  226. }
  227.  
  228. - (NXColor)textColorForCellAt:(int)xPos :(int)yPos
  229. {
  230.     return [[self cellAt:xPos :yPos] textColor];
  231. }
  232.  
  233. - setCellHighlightTextColor:(NXColor)aColor
  234. {
  235.     List    *myCellList;
  236.     id        aCell;
  237.     int        i;
  238.  
  239.     myCellList = [self cellList];
  240.  
  241.     for (i = 0; i < [myCellList count]; i++)
  242.     {
  243.     aCell = [myCellList objectAt:i];
  244.  
  245.     if (overwriteCellColors || 
  246.         NXEqualColor(cellHighlightTextColor, [aCell highlightTextColor]))
  247.       [aCell setHighlightTextColor:aColor];
  248.     }
  249.  
  250.     cellHighlightTextColor = aColor;
  251.  
  252.     return self;
  253. }
  254.  
  255. - (NXColor)cellHighlightTextColor
  256. {
  257.     return cellHighlightTextColor;
  258. }
  259.  
  260. - setHighlightTextColor:(NXColor)aColor forCellAt:(int)xPos :(int)yPos
  261. {
  262.     [[self cellAt:xPos :yPos] setHighlightTextColor:aColor];
  263.  
  264.     return self;
  265. }
  266.  
  267. - (NXColor)highlightTextColorForCellAt:(int)xPos :(int)yPos
  268. {
  269.     return [[self cellAt:xPos :yPos] highlightTextColor];
  270. }
  271.  
  272. - mouseDown:(NXEvent *)theEvent
  273. {
  274.     id        theCell = nil,
  275.         previousCell = nil;
  276.     NXEvent    *nextEvent;
  277.     NXPoint    mouseLocation;
  278.     BOOL    looping = YES;
  279.     int        row = -1,
  280.         col = -1,
  281.             previousRow = -1,
  282.             previousCol = -1,
  283.         oldMask;
  284.  
  285.     nextEvent = theEvent;
  286.  
  287.     if ([self mode] == NX_HIGHLIGHTMODE)
  288.     {
  289.     /* Save our normal window event mask, and add the mouse dragged */
  290.     /* event mask */
  291.  
  292.     oldMask = [window addToEventMask:NX_MOUSEDRAGGEDMASK];
  293.  
  294.     while (looping)
  295.     {
  296.         /* Find the current coordinates of the mouse... */
  297.  
  298.         mouseLocation = nextEvent->location;
  299.  
  300.         /* ... and convert them into our view coordinate system */
  301.  
  302.         [self convertPoint:&mouseLocation fromView:nil];
  303.  
  304.         /* Find the row and column of the mouse */
  305.  
  306.         [self getRow:&row andCol:&col forPoint:&mouseLocation];
  307.  
  308.         if ( (row >= 0) && (col >= 0) && ((row != previousRow) ||
  309.                           (col != previousCol)) )
  310.         {
  311.         theCell = [self cellAt:row :col];
  312.  
  313.         if ([theCell isEnabled])
  314.         {
  315.             if (previousCell && (previousCell != theCell))
  316.               [previousCell incrementState];
  317.  
  318.             [theCell incrementState];
  319.  
  320.             [self display];
  321.  
  322.             previousCell = theCell;
  323.         }
  324.  
  325.         previousRow = row;
  326.         previousCol = col;
  327.         }
  328.         else if (((row < 0) || (col < 0)) && previousCell && 
  329.              [previousCell isEnabled])
  330.         {
  331.         [previousCell incrementState];
  332.         [self display];
  333.         previousCell = nil;
  334.         }
  335.         
  336.         nextEvent = [NXApp getNextEvent:NX_MOUSEUPMASK | 
  337.              NX_MOUSEDRAGGEDMASK];
  338.  
  339.         looping = (nextEvent->type == NX_MOUSEDRAGGED);
  340.     }
  341.  
  342.     [window setEventMask:oldMask];
  343.     }
  344.     else
  345.       return [super mouseDown:theEvent];
  346.  
  347.     return self;
  348. }
  349.  
  350. - displayDate:sender
  351. {
  352.     int    numberOfDays,
  353.     startCell,
  354.         currentDay = 0,
  355.     x,
  356.     y,
  357.         day;
  358.     id    dayCell,
  359.     aDate = nil;
  360.     
  361.     [[self window] disableFlushWindow];
  362.  
  363.  
  364.     if ((aDate = [self dateDelegate]))
  365.     {
  366.     currentDay = [aDate day];
  367.  
  368.     /* Get the number of days for the month that the date object */
  369.     /* is set to */
  370.  
  371.     numberOfDays = [aDate numberOfDaysInMonth];
  372.  
  373.     /* Get the starting day of the month */
  374.  
  375.     startCell = [aDate startDayOfMonth];
  376.  
  377.     }
  378.     else
  379.     {
  380.     currentDay = 1;
  381.     numberOfDays = 31;
  382.     startCell = 4;
  383.     }
  384.  
  385.     // Clear out the titles of the first row of dayCells
  386.     // from the start of the matrix to the x coordinate
  387.     // that corresponds to the day of the week that the
  388.     // month start on
  389.     
  390.     for (x=0, y=0; x < startCell; x++)
  391.     {
  392.     dayCell = [self cellAt:y :x];
  393.  
  394.     if (x == 0)
  395.       [dayCell setDrawEntireBottomEdge:NO];
  396.  
  397.     [dayCell setStringValue:""];
  398.     [dayCell setEnabled:NO];
  399.     }
  400.     
  401.     // Fill in the titles of all the dayCells. When x hits
  402.     // the seventh column of the matrix, we wrap around
  403.     // to the first column and continue filling in values
  404.     // on the next row
  405.     
  406.     for (day = 1; day <= numberOfDays; day++, x++)
  407.     {
  408.     if (x == 7)
  409.     {
  410.         x = 0;
  411.         y++;
  412.     }
  413.  
  414.     dayCell = [self cellAt:y :x];
  415.  
  416.     [dayCell setIntValue:day];
  417.     [dayCell setEnabled:YES];
  418.  
  419.     if (day == currentDay)
  420.       [self selectCellAt:y :x];
  421.  
  422.     if (x == 0)
  423.       [dayCell setDrawEntireBottomEdge:NO];
  424.  
  425.     if (x == 6)
  426.       [dayCell setDrawRightEdge:YES];
  427.     }
  428.     
  429.     // Clear out the titles of the rest of the dayCells
  430.     // from the last day of the month to the end of
  431.     // the matrix. When x hits the seventh column of 
  432.     // the matrix, we wrap around to the first column
  433.     // and continue blanking dayCells on the next row until
  434.     // y hits the seventh row. We are then done with 
  435.     // this matrix
  436.     
  437.     for (; y < 7; x++)
  438.     {
  439.     if (x == 7)
  440.     {
  441.         x = 0;
  442.         y++;
  443.     }
  444.     
  445.     dayCell = [self cellAt:y :x];
  446.  
  447.     if (x == 0)
  448.       [dayCell setDrawEntireBottomEdge:NO];
  449.  
  450.     if (x == 6)
  451.       [dayCell setDrawRightEdge:YES];
  452.  
  453.     [dayCell setStringValue:""];
  454.     [dayCell setEnabled:NO];
  455.  
  456.     }
  457.     
  458.     [self display];
  459.  
  460.     [[self window] reenableFlushWindow];
  461.     [[self window] flushWindowIfNeeded];
  462.  
  463.     return self;
  464. }
  465.  
  466. - read:(NXTypedStream *)aStream
  467. {
  468.     float    red,
  469.         green,
  470.         blue;
  471.     int     version;
  472.  
  473.     [super read:aStream];
  474.  
  475.     version = NXTypedStreamClassVersion(aStream, "MiscCalendarMatrix");
  476.  
  477.     NXReadTypes(aStream, "@@", &dateDelegate, &simpleDate);
  478.  
  479.     NXReadTypes(aStream, "fff", &red, &green, &blue);
  480.     cellBackgroundColor = NXConvertRGBToColor(red, green, blue);
  481.  
  482.     NXReadTypes(aStream, "fff", &red, &green, &blue);
  483.     cellHighlightColor = NXConvertRGBToColor(red, green, blue);
  484.  
  485.     NXReadTypes(aStream, "fff", &red, &green, &blue);
  486.     cellTextColor = NXConvertRGBToColor(red, green, blue);
  487.  
  488.     NXReadTypes(aStream, "fff", &red, &green, &blue);
  489.     cellHighlightTextColor = NXConvertRGBToColor(red, green, blue);
  490.  
  491.     if (version == 1)
  492.       NXReadTypes(aStream, "c", &overwriteCellColors);
  493.  
  494.     return self;
  495. }
  496.  
  497. - write:(NXTypedStream *)aStream
  498. {
  499.     float    red,
  500.         green,
  501.         blue;
  502.  
  503.     [super write:aStream];
  504.  
  505.     NXWriteTypes(aStream, "@@", &dateDelegate, &simpleDate);
  506.  
  507.     NXConvertColorToRGBA(cellBackgroundColor, &red, &green, &blue, 0);
  508.     NXWriteTypes(aStream, "fff", &red, &green, &blue);
  509.  
  510.     NXConvertColorToRGBA(cellHighlightColor, &red, &green, &blue, 0);
  511.     NXWriteTypes(aStream, "fff", &red, &green, &blue);
  512.  
  513.     NXConvertColorToRGBA(cellTextColor, &red, &green, &blue, 0);
  514.     NXWriteTypes(aStream, "fff", &red, &green, &blue);
  515.  
  516.     NXConvertColorToRGBA(cellHighlightTextColor, &red, &green, &blue, 0);
  517.     NXWriteTypes(aStream, "fff", &red, &green, &blue);
  518.  
  519.     NXWriteTypes(aStream, "c", &overwriteCellColors);
  520.  
  521.     return self;
  522. }
  523.  
  524. @end
  525.